<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>moving_fn 聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations-pipeline-movfn-aggregation.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-pipeline-movfn-aggregation.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-pipeline-movfn-aggregation.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations-pipeline-movfn-aggregation.html" rel="nofollow" target="_blank">../en/search-aggregations-pipeline-movfn-aggregation.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-pipeline.html">管道聚合</span>
»
<span class="breadcrumb-node">moving_fn 聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-pipeline-movavg-aggregation.html">« moving_avg 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-pipeline-serialdiff-aggregation.html">serial_diff 聚合 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-pipeline-movfn-aggregation"></a>移动函数(moving_fn)聚合
</h2>
</div></div></div>
<p>
给定一系列有序的数据，移动函数(moving function)聚合将在数据上滑动一个窗口，并允许用户指定在每个数据窗口上执行自定义的脚本。

为方便起见，预定义了一些常用函数，如min/max、移动平均值(moving average)等。
</p>
<p>
这在概念上与<a class="xref" href="search-aggregations-pipeline-movavg-aggregation.html" title="moving_avg 聚合">移动平均(moving average)</a>管道聚合非常相似，不过它提供了更多的功能。
</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_syntax_13"></a>语法
</h3>
</div></div></div>
<p>一个单独的<code class="literal">moving_fn</code>看起来像这样：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
    "moving_fn": {
        "buckets_path": "the_sum",
        "window": 10,
        "script": "MovingFunctions.min(values)"
    }
}</pre>
</div>
<div class="table">
<a id="moving-fn-params"></a>
<p class="title"><strong>表 19. <code class="literal">moving_fn</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="moving_fn Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
<col class="col_3">
<col class="col_4">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
<th align="left" valign="top">是否必需</th>
<th align="left" valign="top">默认值</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">buckets_path</code></p></td>
<td align="left" valign="top"><p>
感兴趣的度量的路径(更多详情请参考 <a class="xref" href="search-aggregations-pipeline.html#buckets-path-syntax" title="buckets_path语法" rel="nofollow"><code class="literal">buckets_path</code>语法</a>)
</p></td>
<td align="left" valign="top"><p>必需</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">window</code></p></td>
<td align="left" valign="top"><p>在直方图上“滑动”的窗口大小。</p></td>
<td align="left" valign="top"><p>必需</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">script</code></p></td>
<td align="left" valign="top"><p>应该在每个数据窗口上执行的脚本</p></td>
<td align="left" valign="top"><p>必需</p></td>
<td align="left" valign="top"><p></p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">shift</code></p></td>
<td align="left" valign="top"><p>窗口位置的<a class="xref" href="search-aggregations-pipeline-movfn-aggregation.html#shift-parameter" title="shift parameter">移动(shift)</a></p></td>
<td align="left" valign="top"><p>可选</p></td>
<td align="left" valign="top"><p>0</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<p>
<code class="literal">moving_fn</code>聚合必须嵌入<code class="literal">histogram</code>或<code class="literal">date_histogram</code>聚合中。

它们可以像任何其他度量聚合一样嵌入：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{                <a id="CO274-1"></a><i class="conum" data-value="1"></i>
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" } <a id="CO274-2"></a><i class="conum" data-value="2"></i>
                },
                "the_movfn": {
                    "moving_fn": {
                        "buckets_path": "the_sum", <a id="CO274-3"></a><i class="conum" data-value="3"></i>
                        "window": 10,
                        "script": "MovingFunctions.unweightedAvg(values)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/573.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO274-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
一个名为“my_date_histo”的<code class="literal">date_histogram</code>聚合是在“timestamp”字段上构建的，间隔为一天
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO274-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">sum</code>度量用于计算字段的总和。

这可以是任何数字度量(sum、min、max等)
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO274-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>
最后，我们指定一个<code class="literal">moving_fn</code>聚合，它使用“the_sum”度量作为其输入。
</p>
</td>
</tr>
</table>
</div>
<p>
移动平均值的构建，首先要指定一个字段的<code class="literal">histogram</code>或<code class="literal">date_histogram</code>聚合。

然后，你可以选择在那个直方图中添加数字度量，如<code class="literal">sum</code>。

最后，<code class="literal">moving_fn</code>被嵌入直方图中。

然后，<code class="literal">buckets_path</code>参数用于“指向”直方图内的一个同级度量(有关<code class="literal">buckets_path</code>语法的描述，请参见<a class="xref" href="search-aggregations-pipeline.html#buckets-path-syntax" title="buckets_path Syntax"><code class="literal">buckets_path</code>语法</a>)。
</p>
<p>来自上述聚合的示例响应可能如下所示：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
   "took": 11,
   "timed_out": false,
   "_shards": ...,
   "hits": ...,
   "aggregations": {
      "my_date_histo": {
         "buckets": [
             {
                 "key_as_string": "2015/01/01 00:00:00",
                 "key": 1420070400000,
                 "doc_count": 3,
                 "the_sum": {
                    "value": 550.0
                 },
                 "the_movfn": {
                    "value": null
                 }
             },
             {
                 "key_as_string": "2015/02/01 00:00:00",
                 "key": 1422748800000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 60.0
                 },
                 "the_movfn": {
                    "value": 550.0
                 }
             },
             {
                 "key_as_string": "2015/03/01 00:00:00",
                 "key": 1425168000000,
                 "doc_count": 2,
                 "the_sum": {
                    "value": 375.0
                 },
                 "the_movfn": {
                    "value": 305.0
                 }
             }
         ]
      }
   }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_custom_user_scripting"></a>自定义用户脚本
</h3>
</div></div></div>
<p>
移动函数聚合允许用户指定任意脚本来定义自定义逻辑。

每次收集新的数据窗口时都会调用该脚本。

这些值在<code class="literal">values</code>变量中提供给脚本。

然后，脚本应该执行某种计算，并输出单个<code class="literal">double</code>(双精度浮点数)作为结果。

虽然允许<code class="literal">NaN</code>和 +/- <code class="literal">Inf</code>，但不允许输出<code class="literal">null</code>。
</p>
<p>
例如，下面这个脚本将只返回窗口中的第一个值，如果没有可用的值，则返回<code class="literal">NaN</code>：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "return values.length &gt; 0 ? values[0] : Double.NaN"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/574.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="shift-parameter"></a>参数"shift"
</h3>
</div></div></div>
<p>
默认情况下(<code class="literal">shift = 0</code>)，为计算提供的窗口是除当前桶之外的最后<code class="literal">n</code>个值。

将<code class="literal">shift</code>增加<code class="literal">1</code>会将起始窗口位置向右移动<code class="literal">1</code>。
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
要将当前桶包括到窗口中，请使用<code class="literal">shift = 1</code>。
</li>
<li class="listitem">
对于中心对齐(当前桶前后的<code class="literal">n / 2</code>个值)，使用<code class="literal">shift = window / 2</code>。
</li>
<li class="listitem">
对于右对齐(当前桶后的<code class="literal">n</code>个值)，使用<code class="literal">shift = window</code>。
</li>
</ul>
</div>
<p>
如果任何一个窗口边缘移出了数据序列的边界，则窗口将收缩以只包含可用值。 
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_pre_built_functions"></a>预先构建的函数
</h3>
</div></div></div>
<p>
为了方便起见，已经预先构建了许多函数，这些函数在<code class="literal">moving_fn</code>脚本上下文中可用：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">max()</code>
</li>
<li class="listitem">
<code class="literal">min()</code>
</li>
<li class="listitem">
<code class="literal">sum()</code>
</li>
<li class="listitem">
<code class="literal">stdDev()</code>
</li>
<li class="listitem">
<code class="literal">unweightedAvg()</code>
</li>
<li class="listitem">
<code class="literal">linearWeightedAvg()</code>
</li>
<li class="listitem">
<code class="literal">ewma()</code>
</li>
<li class="listitem">
<code class="literal">holt()</code>
</li>
<li class="listitem">
<code class="literal">holtWinters()</code>
</li>
</ul>
</div>
<p>
这些函数可从<code class="literal">MovingFunctions</code>命名空间中获得。例如<code class="literal">MovingFunctions.max()</code>
</p>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_max_function"></a>max 函数
</h4>
</div></div></div>
<p>
该函数接受一个双精度值的集合，并返回该窗口中的最大值。

<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；最大值仅在实际值上计算。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。
</p>
<div class="table">
<a id="max-params"></a>
<p class="title"><strong>表 20. <code class="literal">max(double[] values)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="max(double[] values) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>用于查找最大值的值窗口</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_moving_max": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.max(values)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/575.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_min_function"></a>min 函数
</h4>
</div></div></div>
<p>
该函数接受一个双精度值的集合，并返回该窗口中的最小值。

<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；最大值仅在实际值上计算。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。
</p>
<div class="table">
<a id="min-params"></a>
<p class="title"><strong>表 21. <code class="literal">min(double[] values)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="min(double[] values) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>用于查找最小值的值窗口</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_moving_min": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.min(values)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/576.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_sum_function"></a>sum 函数
</h4>
</div></div></div>
<p>
该函数接受一个双精度值的集合，并返回该窗口中值的总和。

<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；总和仅在实际值上计算。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">0.0</code>作为结果。
</p>
<div class="table">
<a id="sum-params"></a>
<p class="title"><strong>表 22. <code class="literal">sum(double[] values)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="sum(double[] values) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>要计算总和的值的窗口</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_moving_sum": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.sum(values)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/577.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_stddev_function"></a>stdDev 函数
</h4>
</div></div></div>
<p>
该函数接受双精度浮点数(double)和平均值(average)的集合，然后返回该窗口中值的标准差。

<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；平均值仅在实际值上计算。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">0.0</code>作为结果。
</p>
<div class="table">
<a id="stddev-params"></a>
<p class="title"><strong>表 23. <code class="literal">stdDev(double[] values)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="stdDev(double[] values) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>用于计算标准差的值窗口</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">avg</code></p></td>
<td align="left" valign="top"><p>窗口的平均值</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_moving_sum": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.stdDev(values, MovingFunctions.unweightedAvg(values))"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/578.console"></div>
<p>
<code class="literal">avg</code>参数必须提供给标准差函数，因为可以在窗口上计算不同类型的平均值(简单<span class="remark">(simple)</span>、线性加权<span class="remark">(linearly weighted)</span>等)。

下面详述的各种移动平均值可用于计算标准差函数的平均值。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_unweightedavg_function"></a>unweightedAvg 函数
</h4>
</div></div></div>
<p>
<code class="literal">unweightedAvg</code>函数计算窗口中所有值的总和，然后除以窗口的大小。

它实际上是窗口的简单算术平均值。

简单移动平均值不执行任何时间相关的加权，这意味着<code class="literal">simple</code>(简单)移动平均的值往往“滞后”于真实数据。
</p>
<p>
<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；平均值仅根据真实值计算得出。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。

这意味着平均值计算中使用的计数是非<code class="literal">null</code>、非<code class="literal">NaN</code>值的计数。
</p>
<div class="table">
<a id="unweightedavg-params"></a>
<p class="title"><strong>表 24. <code class="literal">unweightedAvg(double[] values)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="unweightedAvg(double[] values) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>要计算总和的值的窗口</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.unweightedAvg(values)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/579.console"></div>
</div>

</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_linearweightedavg_function"></a>linearWeightedAvg 函数
</h3>
</div></div></div>
<p>
<code class="literal">linearWeightedAvg</code>函数为序列中的点分配线性权重，使得“较老的”数据点(例如，窗口开始处的那些)对总平均值的贡献线性较小。

线性加权有助于减少数据均值的“滞后”，因为较老的数据点的影响较小。
</p>
<p>
如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。
</p>
<div class="table">
<a id="linearweightedavg-params"></a>
<p class="title"><strong>表 25. <code class="literal">linearWeightedAvg(double[] values)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="linearWeightedAvg(double[] values) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>要计算总和的值的窗口</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.linearWeightedAvg(values)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/580.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_ewma_function"></a>ewma 函数
</h3>
</div></div></div>
<p>
<code class="literal">ewma</code>函数(也称为“单指数”)类似于<code class="literal">linearMovAvg</code>函数，不同的是，旧的数据点的重要性是以指数级降低，而不是线性降低。

重要性衰减的速度可以通过设置<code class="literal">alpha</code>来控制。

较小的值使权重缓慢衰减，这提供了更大的平滑度，并考虑了窗口的更大部分。

较大的值会使权重迅速衰减，从而降低较旧值对移动平均线的影响。

这往往会使移动平均线更密切地跟踪数据，但却不太平滑。
</p>
<p>
<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；平均值仅根据真实值计算得出。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。

这意味着平均值计算中使用的计数是非<code class="literal">null</code>、非<code class="literal">NaN</code>值的计数。
<div class="table">
<a id="ewma-params"></a>
<p class="title"><strong>表 26. <code class="literal">ewma(double[] values, double alpha)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="ewma(double[] values, double alpha) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>要计算总和的值的窗口</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">alpha</code></p></td>
<td align="left" valign="top"><p>指数衰减</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.ewma(values, 0.3)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/581.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_holt_function"></a>holt 函数
</h3>
</div></div></div>
<p>
<code class="literal">holt</code>函数(又名“二次指数”)结合了跟踪数据趋势的第二个指数项。

当数据具有潜在的线性趋势时，单指数表现不佳。

二次指数模型在内部计算两个值：“水平(level)”和“趋势(trend)”。
</p>
<p>
水平(level)计算类似于<code class="literal">ewma</code>，是数据的指数加权视图。

不同之处在于，使用了之前平滑的值，而不是原始值，这使其接近原始序列。

趋势(trend)计算着眼于当前值和上一个值之间的差异(例如，平滑数据的斜率或趋势)。

趋势值也是指数加权的。
</p>
<p>
数值是由水平(level)分量和趋势(trend)分量相乘产生的。
</p>
<p>
<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；平均值仅根据真实值计算得出。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。

这意味着平均值计算中使用的计数是非<code class="literal">null</code>、非<code class="literal">NaN</code>值的计数。
</p>
<div class="table">
<a id="holt-params"></a>
<p class="title"><strong>表 27. <code class="literal">holt(double[] values, double alpha)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="holt(double[] values, double alpha) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>要计算总和的值的窗口</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">alpha</code></p></td>
<td align="left" valign="top"><p>level 衰减值</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">beta</code></p></td>
<td align="left" valign="top"><p>trend 衰减值</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "MovingFunctions.holt(values, 0.3, 0.1)"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/582.console"></div>
<p>
实际上，<code class="literal">alpha</code>值在<code class="literal">holtMovAvg</code>中的表现与<code class="literal">ewmaMovAvg</code>非常相似：小值产生更多平滑和更多滞后，而大值产生更密切的跟踪和更少的滞后。

<code class="literal">beta</code>的值往往很难看出。

较小的值强调长期趋势(例如整个系列中的恒定线性趋势)，而较大的值强调短期趋势。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_holtwinters_function"></a>holtWinters 函数
</h3>
</div></div></div>
<p>
<code class="literal">holtWinters</code>函数(又名“三级指数”)包含第三个指数项，用于跟踪数据的季节性。

因此，这种聚合基于三个要素进行平滑：“水平(level)”、“趋势(trend)”和“季节性(seasonality)”。
</p>
<p>
水平(level)和趋势(trend)计算与<code class="literal">holt</code>里的相同。

季节性(seasonal)计算着眼于当前点与前一时段点之间的差异。
</p>
<p>
与其他移动平均线相比，holt-winters 需要更多的操作。 

你需要指定数据的“周期(periodicity)”：例如，如果你的数据每7天有一个循环趋势，可以设置<code class="literal">period: 7</code>。

类似地，如果有月趋势，你可以把它设置为<code class="literal">30</code>。

目前没有周期性检测，尽管计划在未来进行增强。
</p>
<p>
<code class="literal">null</code>和<code class="literal">NaN</code>值被忽略；平均值仅根据真实值计算得出。

如果窗口为空，或者所有值都为<code class="literal">null</code>或<code class="literal">NaN</code>，则返回<code class="literal">NaN</code>作为结果。

这意味着平均值计算中使用的计数是非<code class="literal">null</code>、非<code class="literal">NaN</code>值的计数。
</p>
<div class="table">
<a id="holtwinters-params"></a>
<p class="title"><strong>表 28. <code class="literal">holtWinters(double[] values, double alpha)</code>参数</strong></p>
<div class="table-contents">
<table border="1" cellpadding="4px" summary="holtWinters(double[] values, double alpha) Parameters">
<colgroup>
<col class="col_1">
<col class="col_2">
</colgroup>
<thead>
<tr>
<th align="left" valign="top">参数名称</th>
<th align="left" valign="top">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">values</code></p></td>
<td align="left" valign="top"><p>要计算总和的值的窗口</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">alpha</code></p></td>
<td align="left" valign="top"><p>水平(level)衰减值</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">beta</code></p></td>
<td align="left" valign="top"><p>趋势(trend)衰减值</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">gamma</code></p></td>
<td align="left" valign="top"><p>季节性(seasonality)衰减值</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">period</code></p></td>
<td align="left" valign="top"><p>数据的周期性</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">multiplicative</code></p></td>
<td align="left" valign="top"><p>为true时使用乘法holt-winters，为false时使用加法</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /_search
{
    "size": 0,
    "aggs": {
        "my_date_histo":{
            "date_histogram":{
                "field":"date",
                "calendar_interval":"1M"
            },
            "aggs":{
                "the_sum":{
                    "sum":{ "field": "price" }
                },
                "the_movavg": {
                    "moving_fn": {
                        "buckets_path": "the_sum",
                        "window": 10,
                        "script": "if (values.length &gt; 5*2) {MovingFunctions.holtWinters(values, 0.3, 0.1, 0.1, 5, false)}"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/583.console"></div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
乘法霍尔特-温特斯的工作原理是将每个数据点除以季节值。

如果任何数据为零，或者数据中有间隙(因为这会导致除以零)，那么这就有问题了。

为了解决这个问题，<code class="literal">mult</code> Holt-Winters用一个非常小的量(1*10<sup>-10</sup>)填充所有的值，这样所有的值都是非零的。

这会影响结果，但影响很小。

如果你的数据是非零的，或者你希望在遇到零时看到<code class="literal">NaN</code>，则可以使用<code class="literal">pad: false</code>禁用此行为
</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_cold_start_2"></a>"cold start" (冷启动)
</h4>
</div></div></div>
<p>
不幸的是，由于 holt-winters 的性质，它需要两个周期(period)的数据来“引导”该算法。

这意味着你的<code class="literal">window</code>值必须<span class="strong strong"><strong>至少</strong></span>是周期(period)的两倍。

如果不是，将会抛出异常。

这也意味着holt-winters不会为第一个<code class="literal">2 * period</code>桶生成值；当前算法不进行回溯。
</p>
<p>
你会注意到在上面的例子中我们有一个<code class="literal">if ()</code>语句来检查值的大小。

这是在调用 holt-winters 函数之前，检查以确保我们有两个周期的数据(<code class="literal">5 * 2</code>，其中5是在<code class="literal">holtWintersMovAvg</code>函数中指定的周期)。
</p>
</div>

</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-pipeline-movavg-aggregation.html">« moving_avg 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-pipeline-serialdiff-aggregation.html">serial_diff 聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>